package com.spring.demo4.factory;

import org.springframework.beans.factory.BeanDefinitionStoreException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.config.BeanDefinition;

/**
 * 基本上所有bean工厂都实现了BeanDefinitionRegistry接口，让bean工厂拥有bean注册的各种能力。
 *
 * @author vhans
 */
public interface MyBeanDefinitionRegistry {

    /**
     * 注册一个新的bean定义
     * 说明一下BeanDefinition:
     * 用来表示bean定义信息的接口,我们向容器中注册bean之前,会通过xml或者其他方式定义bean的各种配置信息,
     * bean的所有配置信息都会被转换为一个BeanDefinition对象，然后通过容器中BeanDefinitionRegistry
     * 接口中的方法,将BeanDefinition注册到spring容器中,完成bean的注册操作。
     *
     * @param beanName       bean的名称
     * @param beanDefinition bean的定义信息
     */
    void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException;

    /**
     * 通过bean名称移除已注册的bean
     *
     * @param beanName bean名称
     */
    void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

    /**
     * 通过bean名称获取bean定义信息
     *
     * @param beanName bean名称
     * @return bean定义信息
     */
    BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

    /**
     * 检查bean是否注册
     */
    boolean containsBeanDefinition(String beanName);

    /**
     * 获取已经注册的bean名称列表
     */
    String[] getBeanDefinitionNames();

    /**
     * 返回容器中已经注册的bean数量
     */
    int getBeanDefinitionCount();

    /**
     * 确定给定的bean是否已在此注册表中使用
     *
     * @param beanName bean名称或者别名
     */
    boolean isBeanNameInUse(String beanName);

}
